package com.anlu.rabbitmq.adkfalse;

import com.anlu.rabbitmq.exchange.direct.DirectProduct;
import com.rabbitmq.client.*;

import java.io.IOException;
import java.util.concurrent.TimeoutException;

public class AckFalseConsumerB {

    public static void main(String[] args) throws IOException, TimeoutException {

        ConnectionFactory factory = new ConnectionFactory();
        factory.setHost("127.0.0.1");

        // 打开连接和创建频道，与发送端一样
        Connection connection = factory.newConnection();
        final Channel channel = connection.createChannel();
        channel.exchangeDeclare(DirectProduct.EXCHANGE_NAME,
                "direct");

        /*声明一个队列*/
        String queueName = "focuserror";
//        queueDeclare(String queue,
//        boolean durable,
//        boolean exclusive,
//        Map<String, Object> arguments);
        /**
         *queue: 队列名称
         *
         * durable： 是否持久化, 队列的声明默认是存放到内存中的，
         * 如果rabbitmq重启会丢失，如果想重启之后还存在就要使队列持久化，
         * 保存到Erlang自带的Mnesia数据库中，当rabbitmq重启之后会读取该数据库
         *
         * exclusive：是否排外的，有两个作用，一：当连接关闭时connection.close()该队列是否会自动删除；
         * 二：该队列是否是私有的private，如果不是排外的，可以使用两个消费者都访问同一个队列，
         * 没有任何问题，如果是排外的，会对当前队列加锁，其他通道channel是不能访问的，
         * 如果强制访问会报异常：com.rabbitmq.client.ShutdownSignalException: c
         * hannel error; protocol method: #method<channel.close>(reply-code=405,
         * reply-text=RESOURCE_LOCKED - cannot obtain exclusive access to locked queue 'queue_name' in vhost '/',
         * class-id=50, method-id=20)一般等于true的话用于一个队列只能有一个消费者来消费的场景
         *
         */
        channel.queueDeclare(queueName,false,false,
                false,null);
         /*绑定，将队列和交换器通过路由键进行绑定*/
        String routekey = "error";/*表示只关注error级别的日志消息*/
        channel.queueBind(queueName,DirectProduct.EXCHANGE_NAME,routekey);
        System.out.println("waiting for message........");

        /*声明了一个消费者*/
        final Consumer consumer = new DefaultConsumer(channel){
            @Override
            public void handleDelivery(String consumerTag,
                                       Envelope envelope,
                                       AMQP.BasicProperties properties,
                                       byte[] body) throws IOException {
                String message = new String(body, "UTF-8");
                System.out.println("Received["+envelope.getRoutingKey()
                        +"]"+message);
//                channel.basicAck(envelope.getDeliveryTag(),false);
            }
        };
        /*消费者正式开始在指定队列上消费消息*/
        channel.basicConsume(queueName,false,consumer);


    }
}
